package com.pai4j.message.core.interceptor;

import com.pai4j.message.model.MessageContext;

/**
 * 消息拦截器接口
 * 用于在消息发送前进行预处理（去重、敏感词过滤、审计等）
 * 
 * 实现此接口可扩展新的拦截器
 *
 * @author PAI4J Team
 * @date 2025-11-01
 */
public interface MessageInterceptor {

    /**
     * 获取拦截器名称
     * 
     * @return 拦截器名称
     */
    String getName();

    /**
     * 拦截处理
     * 
     * @param context 消息上下文
     * @return true-继续处理，false-中断发送
     */
    boolean intercept(MessageContext context);

    /**
     * 获取拦截器的执行顺序
     * 数字越小越先执行
     * 
     * @return 执行顺序（默认100）
     */
    default int getOrder() {
        return 100;
    }

    /**
     * 判断拦截器是否启用
     * 
     * @return 是否启用
     */
    default boolean isEnabled() {
        return true;
    }

    /**
     * 判断是否匹配当前消息
     * 
     * @param context 消息上下文
     * @return 是否匹配
     */
    default boolean matches(MessageContext context) {
        return true;
    }

    /**
     * 前置处理（在intercept之前执行）
     * 
     * @param context 消息上下文
     */
    default void preHandle(MessageContext context) {
        // 默认不做处理
    }

    /**
     * 后置处理（在intercept之后执行）
     * 
     * @param context 消息上下文
     * @param result 拦截结果
     */
    default void postHandle(MessageContext context, boolean result) {
        // 默认不做处理
    }

    /**
     * 异常处理
     * 
     * @param context 消息上下文
     * @param ex 异常
     */
    default void handleException(MessageContext context, Exception ex) {
        // 默认不做处理
    }

    /**
     * 获取拦截器描述信息
     * 
     * @return 描述信息
     */
    default String getDescription() {
        return String.format("MessageInterceptor[name=%s, order=%d, enabled=%s]", 
                getName(), getOrder(), isEnabled());
    }
}

